<?php

namespace app\admin\business;

use app\admin\validate\AdminValidate;
use app\common\model\AdminUser;

class AdminUserBusiness
{
    public $adminUserModel = null;

    public function __construct()
    {
        $this->adminUserModel = new AdminUser();
    }

    /**
     * 在business中不建议在直接返回api数据格式，属于不规范操作，
     * api数据格式最好在Controller层返回给前端的，business层
     * 最好返回bool值（true 或者 false），这里推荐使用抛出异常的方式
     * throw new \think\Exception();
     *  */
    public function getUsername(array $data)
    {
        // 判断用户输入的表单是否为空
        $validate = new AdminValidate();
        if (!$validate->check($data)) {
            # code...
            throw new \think\Exception($validate->getError());
            // throw new \think\Exception('异常错误！');
        }
        
        // 获取用户基础信息
        $adminUser = $this->getAdminUserByUserName($data['username']);
        if (empty($adminUser)) {
            # code...
            throw new \think\Exception('该用户不存在！');
        }

        // 判断密码是否正确！
        if ($adminUser->password != md5($data['password'] . '_214')) {
            throw new \think\Exception('密码错误');
        }
    
        // 更新用户信息
        $updateData = [
                'last_login_time' => time(),
                'last_login_ip' => request()->ip(),
                'update_time' => time()
            ];
        // 将用户id和需要更新的字段和数据传入
        $result = $this->adminUserModel->upDataById($adminUser->id, $updateData);
        if (empty($result)) {
            throw new \think\Exception('登录失败');
        }

        // 记录session
        session('admin_user', $adminUser);

        return true;
    }

    // 这样写有一个好处，比方说控制器层需要获取用户名的个人信息，则直接调用即可！
    public function getAdminUserByUserName($username)
    {
        // 传入用户名
        $adminUser = $this->adminUserModel->getAdminByUsername($username);
        // 判断用户是否存在和状态是否正确！
        if (empty($adminUser) || $adminUser->status != 1) {
            return [];
        }
        // 用户存在则返回用户的基础数据！
        return $adminUser;
    }
}
